package com.idp.web.service;

import com.idp.common.persistence.Page;
import com.idp.web.dto.DepartmentListDTO;
import com.idp.web.dto.DepartmentSelectListDTO;
import com.idp.web.dto.DepartmentTreeDTO;
import com.idp.web.entity.Department;
import com.idp.web.entity.HospitalDepartment;
import com.idp.web.vo.DepartmentSearchVo;

import java.util.List;

/**
 * 医院科室service接口
 *
 * @author xubinren
 * @version 1.0
 * @date 2018/2/28
 */
public interface IDepartmentService {

    /**
     * 根据条件分页查询科室列表
     *
     * @param department 查询条件
     * @param page       页面信息
     * @return Page<Department>
     */
    Page<Department> findByPage(Department department, Page<Department> page);

    /**
     * 根据条件查询科室列表
     *
     * @param department 查询条件
     * @return List<Department>
     */
    List<Department> findBySearch(Department department);

    /**
     * 根据权重查询科室列表,参数只要不传1和2表示查询1（一级科室）
     *
     * @param weight 权重
     * @param hospitalId 医院id
     * @return List<DepartmentSelectListDTO>
     */
    List<DepartmentSelectListDTO> selectListByWeight(int weight, String hospitalId);

    /**
     * 根据id查询对应的科室信息
     *
     * @param id 科室id
     * @return Department
     */
    Department getById(String id);

    /**
     * 新增
     *
     * @param department 科室信息
     * @param userId     用户id
     */
    boolean add(Department department, HospitalDepartment hospitalDepartment, String userId);

    /**
     * 修改
     *
     * @param department 科室信息
     * @param userId     用户id
     */
    boolean update(Department department, String userId);

    /**
     * 根据主键删除对应的科室信息
     *
     * @param id 科室id
     */
    void delete(String id);

    /**
     * 根据父id查询对应的科室列表信息
     *
     * @param departmentSearchVo 查询条件
     * @return List<DepartmentListDTO>
     */
    List<DepartmentListDTO> findForTreeTable(DepartmentSearchVo departmentSearchVo);

    /**
     * 科室树获取
     *
     * @return List<DepartmentTreeDTO>
     */
    List<DepartmentTreeDTO> find(DepartmentSearchVo department);

    /**
     * 根据科室名称验证是否已经存在相同的科室
     * 存在：返回true；不存在：返回false
     * 参数传递前请自己验证，此方法不会进行验证
     *
     * @param departmentName 科室名称
     * @return boolean
     */
    boolean checkByName(String departmentName);

    /**
     * 查询医院的科室的统计信息
     *
     * @param type 科室权重：1，一级科室；2，二级科室
     * @param hospitalId 医院id
     * @return boolean
     */
    int queryStatistics(int type, String hospitalId);

    /**
     * 查询父id下的科室排序最大值，并加一
     * 用于用户在创建或编辑科室信息，排序没有填写的时候使用
     *
     * @param parentId 父id
     * @return boolean
     */
    int getDefaultSort(String parentId);
}
